package repproyectobases;
//import com.mysql.jdbc.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Timestamp;
import java.util.ArrayList;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class Sql {
    private conectate con;

    public Sql(){
        con = new conectate();
    }

     /*
    * INSERTRA UN NUEVO REGISTRO EN LA BASE DE DATOS
    * PARAMETROS(Un array de String con los datos a insertar,la instruccion sql)
    */
  public boolean Ejecutar_Insruccion_Sql(String datos[], String sql){
      boolean ok=false;
       try {
            PreparedStatement pstm = con.getConnection().prepareStatement(sql);
            for(int i=0; i<=datos.length-1;i++){
                pstm.setString(i+1, datos[i]);
            }
            pstm.execute();
            pstm.close();
            ok=true;
         }catch(SQLException e){
         System.out.println(e);
      }
      return ok;
   }

  public boolean existe(String campo, String from_where){
     int registros = 0;
     try
     {
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count("+campo+") as total  " + from_where);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
     }
     catch(SQLException e)
     {
         System.out.println(e);
     }
     //true: existe
     //false: no existe
     if (registros >0){return true;}else{return false;}
  }
  
  public void crearFactura(String numFact, Timestamp da, String obs)
  {
      int x=-30;
      try
      {
          PreparedStatement pstm=con.getConnection().prepareStatement("insert into facturaventa(idfactura, fechaCompra, observacion) values(?, ?, ?)");
          pstm.setString(1, numFact);
          pstm.setTimestamp(2, da);
          pstm.setString(3, obs);
          x=pstm.executeUpdate();
          //System.out.println("Fac: "+x);
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
  }
  
  public boolean registrarDetallePedido(int id,String cant,String valo, Double tot, int repuesto, int pedido, String factu)
  {
      try
      {
          PreparedStatement pstm=con.getConnection().prepareStatement("insert into detallepedido(id, cantidad, valorunidad, total, repuestos_idrepuestos1, pedido_idpedido1, facturaventa_idfactura) values(?, ?, ?, ?, ?, ?, ?)");
          pstm.setInt(1, id);
          pstm.setString(2, cant);
          pstm.setString(3, valo);
          pstm.setDouble(4, tot);
          pstm.setInt(5, repuesto);
          pstm.setInt(6, pedido);
          pstm.setString(7, factu);
          if(pstm.executeUpdate()>0)
          {
              return true;
          }
          else
          {
              return false;
          } 
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
      return false;
  }
  
  public void crearPedido(int idpedido, int emple, java.sql.Date da, int client)
  {
      int x=-30;
      try
      {
          PreparedStatement pstm=con.getConnection().prepareStatement("insert into pedido(idpedido, fechapedido, empleados_codigo, cliente_codigo) values(?, ?, ?, ?)");
          pstm.setInt(1, idpedido);
          pstm.setDate(2, da);
          pstm.setInt(3, emple);
          pstm.setInt(4, client);
          x=pstm.executeUpdate();
          //System.out.println("Ped: "+x);
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
  }
  
  public int alterStock(int num,int id)
  {
      int z=0;
      
      try
      {
          z=actualStock(num,""+id);
          //System.out.println("Actual Stock: "+z);
          PreparedStatement pstm=con.getConnection().prepareStatement("UPDATE repuestos SET cantidad=? WHERE idrepuestos=?;");
          
          pstm.setInt(1, z);
          pstm.setInt(2, id);
          pstm.executeUpdate();
          
          return z;
      }
      catch (SQLException e)
      {
          System.out.println("Dos: "+e);
      }
      
      return z;
  }
  
  public int actualStock(int num,String id)
  {
      int z=0;
      
      try
      {
          PreparedStatement pstm1=con.getConnection().prepareStatement("SELECT r.cantidad FROM Repuestos r WHERE r.idrepuestos="+id+";");
          ResultSet res = pstm1.executeQuery();
          res.next();
          
          //System.out.println("Actual: "+res.getString(1)+" - Compra: "+num);
          z=Integer.parseInt(res.getString(1))-num;
          res.close();
          return z;
      }
      catch (SQLException e)
      {
          System.out.println("Uno:"+e);
      }
      
      return z;
  }
  
  public String getCodEmpleado(String g)
  {
      String x="";
      
      try
      {
          PreparedStatement pstm = con.getConnection().prepareStatement("SELECT e.codigo,p.nombre FROM Persona p JOIN Empleados e ON p.cedula=e.persona_cedula WHERE e.codigo="+g+";" );
          ResultSet res = pstm.executeQuery();
          res.next();
          //x="Codigo: "+res.getString(1)+" Nombre: "+res.getString(2);
          x=res.getString(2);
          //System.out.println(x);
          res.close();
          return x;  
      }
      catch (SQLException e)
      {
          System.out.println(e);
      }
      
      return "Fuck!";
  }
  
  public String getCodCleinte(String g)
  {
      String x="";
      
      try
      {
          PreparedStatement pstm = con.getConnection().prepareStatement("SELECT c.codigo,p.nombre FROM Persona p JOIN Cliente c ON p.cedula=c.persona_cedula WHERE c.codigo="+g+";" );
          ResultSet res = pstm.executeQuery();
          res.next();
          //x="Codigo: "+res.getString(1)+" Nombre: "+res.getString(2);
          x=res.getString(2);
          //System.out.println(x);
          res.close();
          return x;  
      }
      catch (SQLException e)
      {
          System.out.println(e);
      }
      
      return "Fuck!";
  }

    public String GetDataString(String colName, String sql){
    String data ="";
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         while(res.next()){
            data = res.getString(colName);
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
    }

    public Double GetDataDouble(String colName, String sql){
    double data =0;
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         while(res.next()){
            data = res.getDouble(colName);
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
    }
    
    public ArrayList<String> getIdNombreRepuesto()
    {
        ArrayList data = new ArrayList<String>();
        
        try
        {
            PreparedStatement pstm = con.getConnection().prepareStatement("SELECT r.idrepuestos,r.nombre FROM Repuestos r;" );
            ResultSet res = pstm.executeQuery();
            int i=0;
            while(res.next())
            {
                data.add(""+res.getString(1)+"-"+res.getString(2));
                i++;
            }
            res.close();
            
            return data;
        }
        catch (SQLException e)
        {
            System.out.println(e);
        }
       
        return null;
    }
    
    public String[] masterColumnNames(String sql)
    {
        int x;
        String y[];
        
        try
        {
             PreparedStatement pstm = con.getConnection().prepareStatement(sql);
             ResultSet res = pstm.executeQuery();
             ResultSetMetaData me=(ResultSetMetaData)res.getMetaData();
             x=me.getColumnCount();
             y=new String[x];
             for(int i=0;i<y.length;i++)
             {
                 y[i]=me.getColumnLabel(i+1);
             }
             return y;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        
        return null;          
    }
    
    public ArrayList<Object[]> masterGetTabla(String colNames[],String sql,int x)
    {
        ArrayList <Object[]> regis = new ArrayList<Object[]>();
  
        //realizamos la consulta sql y llenamos los datos en "Object"
        try
        {
            PreparedStatement pstm = con.getConnection().prepareStatement(sql);
            ResultSet res = pstm.executeQuery();
            int i=0;
            while(res.next())
            {
                Object[] data = new String[x];
                for(int j=0; j<x;j++)
                {
                    data[j] = res.getString(j+1);
                }
                regis.add(i,data); 
                i++;
            }
            res.close();
            return regis;
         }
         catch(SQLException e)
         {
            System.out.println("2: "+e);
         }
         return null;
    }

    public Object[] GetColumna(String tabla, String colName, String sql){
      int registros = 0;
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(*) as total FROM " + tabla);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }

    Object[] data = new Object[registros];
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            data[i] = res.getObject(colName);
            i++;
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }
    
    public ArrayList<String> GetComboCliente()
    {
        ArrayList<String>  registros = new ArrayList<String>();
      
      try
      {
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT c.codigo,p.nombre FROM Persona p JOIN Cliente c ON p.cedula=c.persona_cedula;" );
         ResultSet res = pstm.executeQuery();
         int i=0;
         while(res.next())
         {
             registros.add(""+res.getString(1)+"-"+res.getString(2));
             i++;
         }
         
         res.close();
         return registros;
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
      return null;
    }

      /*  METODO PARA OBTENER TODOS LOS DATOS DE UNA TABLA
    *  parametros (Un array con los nombres de las columnas, el nombre de la tabla, la instruccion sql)
    */
   public Object [][] GetTabla(String colName[], String tabla, String sql){
      int registros = 0;
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(*) as total FROM " + tabla);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println("1: "+e);
      }

    Object[][] data = new String[registros][colName.length];
    String col[] = new String[colName.length];
    //realizamos la consulta sql y llenamos los datos en "Object"
      try{
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            for(int j=0; j<=colName.length-1;j++){
                col[j] = res.getString(colName[j]);
                data[i][j] = col[j];
            }
            i++;
         }
         res.close();
          }catch(SQLException e){
         System.out.println("2: "+e);
    }
    return data;
 }
}
